print(str(123))
# 123
print(repr(123))
# 123

print(str("FishC"))
# FishC
print(repr("FishC"))
# 跟 str 有区别
# 'FishC'

# eval:将参数去掉引号之后再执行
print(eval("1 + 2"))
# 3

# NameError: name 'FishC' is not defined
# eval(str("FishC"))
# 会报错，因为 eval 会尝试去执行代码 FishC，肯定会报错


print(eval(repr(12345)))
# 12345
# 有人说：eval 是 repr 的反函数

print("================================================================================" * 3)


# str 对应魔法方法 __str__
# repr 对应魔法方法 __repr__
# 并且 __repr__ 这个魔法方法是可以对 __str__ 魔法方法进行代偿的，也就是说我们指定呀了 __repr__ 方法，
# 我们调用 str 函数的时候也是可以的，因为他会去执行代偿方法 __repr__

class C:

    def __repr__(self):
        return "I love FishC"


c = C()
r_repr = repr(c)
print(r_repr)
# I love FishC

r_str = str(c)
print(r_str)  # 它会去执行 __repr__
# I love FishC


print("================================================================================" * 3)


# str 对应魔法方法 __str__
# repr 对应魔法方法 __repr__
# 并且 __repr__ 这个魔法方法是可以对 __str__ 魔法方法进行代偿的，也就是说我们指定呀了 __repr__ 方法，
# 我们调用 str 函数的时候也是可以的，因为他会去执行代偿方法 __repr__

class D:

    def __repr__(self):
        return "I love FishC"

    def __str__(self):
        return "I love Sword"


d = D()
d_repr = repr(d)
print(d_repr)
# I love FishC

d_str = str(d)
print(d_str)
# I love Sword


print("================================================================================" * 3)


class F:

    def __str__(self):
        return "I love FishC"


f = F()
f_repr = repr(f)
print(f_repr)
# <__main__.F object at 0x1051ba940>

print("================================================================================" * 3)

f_str = str(f)
print(f_str)
# I love FishC


print("================================================================================" * 3)
fs = [F(), F(), F()]
for each in fs:
    print(each)
# I love FishC
# I love FishC
# I love FishC

print("================================================================================" * 3)

print(fs)
# [<__main__.F object at 0x107874fa0>, <__main__.F object at 0x107874f70>, <__main__.F object at 0x1078745b0>]

print("================================================================================" * 3)


class G:

    def __repr__(self):
        return "I love FishC"


gs = [G(), G(), G()]
print(gs)
# [I love FishC, I love FishC, I love FishC]

print("================================================================================" * 3)


class H:

    def __init__(self, data):
        self.data = data

    def __str__(self):
        return f"data = {self.data}"

    def __repr__(self):
        return f"H({self.data})"

    def __add__(self, other):
        self.data += other


h = H(250)

# print 函数会被 __str__ 拦截
print(h)
# data = 250
print("================================================================================" * 3)
h + 20
print(h)
# data = 500
